home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / helpfile / source / fxvideo.lina < prev    next >
Encoding:
Text File  |  2007-08-17  |  15.6 KB  |  403 lines

  1. <lina:create file="fxvideo.html" title="Video display shader support">
  2.     
  3.     <p>
  4.         VirtualDub has a special video display driver called the <em>D3D FX driver</em> that allows the power of a 3D
  5.         accelerator to be unleashed when displaying video. This is only for display purposes — the result can't
  6.         be saved to disk — but it is useful for improving display quality as well as experimenting with different
  7.         image processing algorithms. The power and ease of programming for modern GPUs makes it possible to prototype a
  8.         shader for an algorithm in minutes that runs in real-time.
  9.     </p>
  10.  
  11.     <h2>Requirements and enabling the driver</h2>
  12.     <p>
  13.         A 3D accelerator with hardware support for vertex and pixel shaders is required to use the Direct3D FX display
  14.         driver in VirtualDub. A video card which supports at least pixel shader 2.0 is highly recommended, as pixel
  15.         shader models 1.1-1.4 are very restricted in the amount of computation and texture fetches that can be performed
  16.         in a single pass.
  17.     </p>
  18.     <p>
  19.         In addition, you must have <tt>d3dx9_25.dll</tt>, the D3DX DLL from the DirectX 9.0c April 2005 release, installed.
  20.         This DLL does not come with VirtualDub and must be installed from the DirectX redistributable; currently it is
  21.         <em>not</em> installed by the standard DirectX 9.0c install on Windows Update. As of July 3, 2006, the April
  22.         2005 D3DX dll redistributable is available as <tt>directx_9c_Apr05sdk_redist.exe</tt> at the following URL:
  23.     </p>
  24.     <blockquote><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=402111C4-6478-46C1-BBD9-1BF9FCCE52F4&displaylang=en">http://www.microsoft.com/downloads/details.aspx?​FamilyId=402111C4-6478-46C1-BBD9-1BF9FCCE52F4&​displaylang=en</a></blockquote>
  25.     <p>
  26.         Note that <tt>d3dx9_25.dll</tt> is a system DLL — it is intended to be installed only by the DirectX Setup
  27.         installer into the <tt>Windows\System32</tt> directory.
  28.     </p>
  29.  
  30.     <p>
  31.         To enable the FX driver, go to <em>Options > Preferences > Display</em>. DirectX support, Direct3D support,
  32.         and the FX driver should all be enabled. The filename of an <tt>.fx</tt> file must be supplied to use; if a full
  33.         path is not given, the file is assumed to come from VirtualDub's program directory.
  34.     </p>
  35.     <p>
  36.         For detailed documentation on the <tt>.fx</tt> file format, consult the Microsoft DirectX 9.0c SDK.
  37.     </p>
  38.  
  39.     <h2>Available surfaces and textures</h2>
  40.     <p>
  41.         A total of three textures and one surface are available for use:
  42.     </p>
  43.     <ul>
  44.         <li>The output render target, sized to the output frame.</li>
  45.         <li>The source texture, which holds the current video frame.</li>
  46.         <li>The previous source texture, which holds the last video frame.</li>
  47.         <li>Two temporary render target textures, which are at least as large as the desktop.</li>
  48.     </ul>
  49.     <p>
  50.         Declaring variables with specific names will automatically cause them to be bound to the textures:
  51.     </p>
  52. <blockquote><pre>
  53. texture vd_srctexture;
  54. texture vd_prevsrctexture;   // new - 1.7.1
  55. texture vd_prevsrc2texture;  // new - 1.7.3
  56. texture vd_temptexture;
  57. texture vd_temptexture2;
  58. </pre></blockquote>
  59.     <p>
  60.         The output render target is at least <tt>X8R8G8B8</tt>. The temporary render targets are of format <tt>A8R8G8B8</tt>;
  61.         in addition, they are guaranteed to be powers of two as long as the device does not support full
  62.         non-power-of-two textures; in particular, the restrictions of the <tt>NONPOW2CONDITIONAL</tt> caps bit do
  63.         not have to be followed when using them.
  64.     </p>
  65.     <p>
  66.         The <tt>vd_srctexture</tt> variable can take a single annotation:
  67.     </p>
  68.     <dl>
  69.         <dt>bool vd_forceframeupload = <i>force_flag</i>; // new - 1.7.1</dt>
  70.         <dd>
  71.             If <tt>true</tt>, this annotation changes the behavior of image upload when operating in field
  72.             mode. Normally, when field display mode is enabled, the even and odd fields of the source texture
  73.             are alternately updated; this effectively applies weave deinterlacing to the input. When <tt>vd_forceframeupload</tt>
  74.             is set to <tt>true</tt>, both fields are uploaded on the first field of every frame.
  75.         </dd>
  76.     </dl>
  77.  
  78.     <h2>Technique selection and execution</h2>
  79.     <p>
  80.         A technique must be named either <em>point</em>, <em>bilinear</em>, or <em>bicubic</em> for it to be used.
  81.         Each of these names maps to one of the filtering modes in the right-click context menu of the video pane;
  82.         this allows up to three techniques to be selected from the <tt>.fx</tt> file. If a technique is not available,
  83.         a nearby available technique from the three is used instead.
  84.     </p>
  85.     <p>
  86.         When a video frame is displayed, VirtualDub sequentially executes each of the passes in the file. If interlaced
  87.         display mode is enabled, the technique is executed twice per frame, after each field is updated. This allows
  88.         field-savvy shaders to do adaptive deinterlacing on the video input.
  89.     </p>
  90.     <p>
  91.         Each pass is executed with a quad (four vertex rectangular mesh). The components of the vertex declaration accessible
  92.         from the vertex shader are (all are two component):
  93.     </p>
  94.     <ul>
  95.         <li><em>POSITION:</em> The four corners of the output viewport. These are already corrected for the Direct3D half-pixel offset so that they exactly encompass the screen.</li>
  96.         <li><em>TEXCOORD0:</em> The four corners of the source image subrect within the source texture.</li>
  97.         <li><em>TEXCOORD1:</em> Full-texture analogs of the first texcoord set — (0,0), (0,1), (1,0), and (1,1).</li>
  98.     </ul>
  99.     <p>
  100.         Thus, passing POSITION and TEXCOORD0 through is enough to do a straight blit using point or bilinear sampling.
  101.     </p>
  102.  
  103.     <h2>Pass annotations</h2>
  104.     <p>
  105.         Passes within a rendering technique can be annotated to instruct VirtualDub to take certain actions prior to
  106.         executing that pass.
  107.     </p>
  108.     <dl>
  109.         <dt>float4 vd_clear = { red, green, blue, alpha };</dt>
  110.         <dd>
  111.             Clears the render target to the given color. All channel values are normalized and range from 0-1.
  112.         </dd>
  113.  
  114.         <dt>string vd_target = "temp";<br/>
  115.             string vd_target = "temp2";<br/>
  116.         </dt>
  117.         <dd>
  118.             Selects the render target texture to use for rendering. If this is not specified, the output render target
  119.             is used instead. The viewport is automatically set to the entire texture.
  120.         </dd>
  121.         
  122.         <dt>int vd_fieldmask = mask; // new - 1.7.1</dt>
  123.         <dd>
  124.             Restricts a pass to running in only certain fields during field playback:
  125.             <ul>
  126.                 <li>1 - run during even field only</li>
  127.                 <li>2 - run during odd field only</li>
  128.                 <li>3 - run during either field</li>
  129.             </ul>
  130.             If this annotation is absent, the pass always runs.
  131.         </dd>
  132.     </dl>
  133.     <p>
  134.         This is an example of a pass with annotations:
  135.     </p>
  136.     <blockquote><pre>
  137. pass p0
  138. <
  139.     string vd_target = "temp";
  140.     float4 vd_clear = { 0, 0, 0, 0 };
  141. >
  142. {
  143.     VertexShader = compile vs_2_0 VS();
  144.     PixelShader = compile ps_2_0 PS();
  145. }
  146.     </pre></blockquote>
  147.     <h2>Exported variables</h2>
  148.     <p>
  149.         Declaring global variables with specific names will cause those variables to automatically be filled in
  150.         by VirtualDub with data useful for rendering. These values are constant throughout the technique execution, as the
  151.         source values do not change between passes.
  152.     </p>
  153.     <p>
  154.         Here are the supported variables:
  155.     </p>
  156.     <dl>
  157.         <dt>float4 vd_vpsize;</dt>
  158.         <dd>
  159.             Viewport size and inverse viewport size. This is the size of the output window, in pixels. <tt>vd_vpsize.xy</tt> gives
  160.             the width and height of the viewport; <tt>vd_vpsize.wz</tt> gives 1/width and 1/height.
  161.         </dd>
  162.  
  163.         <dt>float4 vd_texsize;</dt>
  164.         <dd>
  165.             Texture size and inverse texture size for the source texture. This is the size of the input source image <em>texture</em>, in
  166.             texels (it is <em>not</em> the source image size). <tt>vd_texsize.xy</tt> gives the width and height of the texture;
  167.             <tt>vd_texsize.wz</tt> gives 1/width and 1/height. This is useful for computing UV coordinates.
  168.         </dd>
  169.  
  170.         <dt>float4 vd_srcsize;</dt>
  171.         <dd>
  172.             Size and inverse size of the source image. This is the size of the video frame, which is in the top-left subrect of the source
  173.             texture. <tt>vd_srcsize.xy</tt> gives the size of the video frame, and <tt>vd_srcsize.wz</tt> gives 1/width and 1/height.
  174.         </dd>
  175.  
  176.         <dt>float4 vd_tempsize;<br/>
  177.             float4 vd_temp2size;
  178.         </dt>
  179.         <dd>
  180.             Texture size and inverse texture size for the primary and secondary render target textures, respectively.
  181.         </dd>
  182.  
  183.         <dt>float4 vd_vpcorrect;</dt>
  184.         <dd>
  185.             <p>
  186.                 Screen space mapping and correction for the viewport. <tt>pos * vd_vpcorrect.xy + vd_vpcorrect.wz</tt> transforms
  187.                 <tt>pos</tt> from screen space coordinates, where (0,0) is the bottom-left corner and <tt>vd_vpsize.xy</tt> is the top-right corner,
  188.                 to the correct normalized display coordinates (NDC) for the output render target.
  189.             </p>
  190.             <p>
  191.                 The annoying half-pixel shift imposed by Direct3D is taken care of in the translation — the screen space coordinates
  192.                 established by this transform use OpenGL-style pixel placement, with pixel centers at half-integers.
  193.             </p>
  194.         </dd>
  195.  
  196.         <dt>float4 vd_vpcorrect2;</dt>
  197.         <dd>
  198.             <p>
  199.                 This is the same as <tt>vd_vpcorrect</tt>, except that the coordinate mapping is inverted so that (0,0) is the top-left.
  200.             </p>
  201.         </dd>
  202.  
  203.         <dt>float4 vd_tvpcorrect;<br/>
  204.             float4 vd_tvpcorrect2;<br/>
  205.             float4 vd_t2vpcorrect;<br/>
  206.             float4 vd_t2vpcorrect2;
  207.         </dt>
  208.         <dd>
  209.             <p>
  210.                 These are the analogous screen space mappings for the primary and secondary render target textures, respectively.
  211.             </p>
  212.         </dd>
  213.     </dl>
  214.  
  215.     <h2>Custom textures (1.7.3+)</h2>
  216.     <p>
  217.         Annotations can be used to control the dimensions of a texture:
  218.     </p>
  219.     <dl>
  220.         <dt>string ResourceType;</dt>
  221.         <dd>
  222.             Specifies the Direct3D resource type of the texture. Can be <tt>1D</tt>, <tt>2D</tt>, <tt>3D</tt>, or <tt>cube</tt>. The
  223.             default is 2D.
  224.         </dd>
  225.         
  226.         <dt>float2/3 Dimensions;</dt>
  227.         <dd>
  228.             Specifies the width, height, and depth of a texture, in texels. The texture size is automatically adjusted to
  229.             powers of two as needed.
  230.         </dd>
  231.         
  232.         <dt>string Format;</dt>
  233.         <dd>
  234.             Specifies the Direct3D format of a texture. The format name is the same as the <tt>D3DFORMAT</tt> constant name, without the
  235.             <tt>D3DFMT_</tt> prefix, i.e. <tt>A8R8G8B8</tt>.
  236.         </dd>
  237.         
  238.         <dt>string Function;</dt>
  239.         <dd>
  240.             Specifies the name of a function to use as a texture shader for initializing the texture.
  241.         </dd>
  242.         
  243.         <dt>int MIPLevels;</dt>
  244.         <dd>
  245.             Specifies the number of mip map levels to allocate. A value of zero means to allocate a full mip chain.
  246.         </dd>
  247.         
  248.         <dt>float2 ViewportRatio;</dt>
  249.         <dd>
  250.             Specifies a pair of ratios so that the size of the texture is proportional to the viewport size. If a texture shader is
  251.             specified, it is re-evaluated every time the texture size is updated.
  252.         </dd>
  253.         
  254.         <dt>int width;</dt>
  255.         <dd>
  256.             Specifies the width of the texture, in texels. This is used only if the <tt>Dimensions</tt> annotation is not present.
  257.         </dd>
  258.         
  259.         <dt>int height;</dt>
  260.         <dd>
  261.             Specifies the height of the texture, in texels. This is used only if the <tt>Dimensions</tt> annotation is not present.
  262.         </dd>
  263.     </dl>
  264.     <p>
  265.         The type of a texture can also be specified by semantic:
  266.     </p>
  267.     <dl>
  268.         <dt>RenderColorTarget</dt>
  269.         <dd>
  270.             Specifies that the texture should be allocated with Direct3D <tt>RENDERTARGET</tt> usage.
  271.         </dd>
  272.         
  273.         <dt>RenderDepthStencilTarget</dt>
  274.         <dd>
  275.             Specifies that the texture should be allocated with Direct3D <tt>DEPTHSTENCIL</tt> usage.
  276.         </dd>
  277.     </dl>
  278.     <p>
  279.         Whenever a custom texture is created, a mirror variable with the suffix <tt>_size</tt> with type float or vector is checked
  280.         for. If this variable is present, its x and y components are filled with the width and height in texels, and w and z with
  281.         the reciprocal width and height (note that the order is w and z, not z and w).
  282.     </p>
  283.     
  284.     <h2>Texture shaders</h2>
  285.     <p>
  286.         <em>D3DX texture shaders</em> can be used to precalculate a texture prior to video display. These shaders
  287.         are only run once when the <tt>.fx</tt> file is loaded, and the result then reused for each video frame.
  288.         As they run on the CPU, they can use shader features not necessarily supported by the GPU, and are thus useful for
  289.         computing lookup tables to work around the feeble calculation abilities of lower shader models.
  290.     </p>
  291.     <p>
  292.         VirtualDub uses a set of annotations on the texture object to control texture shader execution. These annotations
  293.         are compatible with those used by the EffectEdit tool. The generated texture is always of the format <tt>A8R8G8B8</tt>.
  294.     </p>
  295.     <dl>
  296.         <dt>float width;<br/>
  297.             float height;
  298.         </dt>
  299.         <dd>
  300.             Sets the width and height of the texture. These are not adjusted to device requirements, so it is safest
  301.             to use powers of two.
  302.         </dd>
  303.  
  304.         <dt>string target;</dt>
  305.         <dd>
  306.             The profile to use when compiling the texture shader. It defaults to <tt>tx_1_0</tt> if absent.
  307.         </dd>
  308.  
  309.         <dt>string function;</dt>
  310.         <dd>
  311.             The name of the HLSL function to use for the texture shader.
  312.         </dd>
  313.     </dl>
  314.     <p>
  315.         Here is an example of a texture shader in use:
  316.     </p>
  317.     <blockquote><pre>
  318. texture proceduraltex
  319. <
  320.     string function = "gen";
  321.     int width = 16;
  322.     int height = 256;
  323. >;
  324.  
  325. float4 gen(float2 texcoord : POSITION,
  326.            float2 texelSize : PSIZE) : color0
  327. {
  328.     return texcoord.xyxy;
  329. }
  330.     </pre></blockquote>
  331.     <p>
  332.         Starting with 1.7.3, texture shaders can be applied to volume and cube textures.
  333.     </p>
  334.  
  335.     <h2>Caveats</h2>
  336.     <p>
  337.         VirtualDub does not (cannot) do emulation of pixel shader models that are not supported by the GPU.
  338.         This is particularly important for older video cards only supporting pixel shader 1.1-1.4, which
  339.         are much more restrictive than pixel shader 2.0 or 3.0. Some restrictions to watch out for:
  340.     </p>
  341.     <ul>
  342.         <li>ps_1_x does not have a way to normalize a vector or retrieve its length.</li>
  343.         <li>ps_1_1 through ps_1_3 can't do dependant texture reads except through the special texture
  344.             addressing operations, which can only be accessed from shader assembly. A dependant texture
  345.             read is a texture read based on a calculated texture coordinate, i.e. not from a texture
  346.             coordinate set.
  347.         </li>
  348.         <li>
  349.             ps_1_4 can do dependant texture reads, but only one layer deep, and with limited precision.
  350.         </li>
  351.     </ul>
  352.     <p>
  353.         This is not to say that interesting and useful display shaders can't be written in downlevel
  354.         shader models, but it requires some careful thought and coding. ps_1_4 is pretty rare as it
  355.         was only introduced in the ATI RADEON 8xxx series; ps_1_1 was introduced with the NVIDIA GeForce 3
  356.         and ps_1_2/ps_1_3 with the GeForce 4, however. All cards with given shader model support can
  357.         run all downlevel shaders, however, so a GeForce FX 5800 can run ps_1_4 shaders even though
  358.         its highest supported model is ps_2_a.
  359.     </p>
  360.     
  361.     <h2>An example shader</h2>
  362.     <p>
  363.         This effect file produces an emboss effect on the displayed video. It should work on any video
  364.         card with pixel shader support.
  365.     </p>
  366. <blockquote><pre>
  367. texture vd_srctexture;
  368. float4 vd_texsize;
  369.  
  370. sampler src = sampler_state {
  371.     Texture = <vd_srctexture>;
  372.     AddressU = clamp;
  373.     AddressV = clamp;
  374.     MinFilter = linear;
  375.     MagFilter = linear;
  376.     MipFilter = linear;
  377. };
  378.  
  379. void VS(
  380.     float4 pos : POSITION,
  381.     float2 uv : TEXCOORD0,
  382.     out float4 hPos : POSITION,
  383.     out float2 uv0 : TEXCOORD0,
  384.     out float2 uv1 : TEXCOORD1)
  385. {
  386.     hPos = pos;
  387.     uv0 = uv - vd_texsize.wz;
  388.     uv1 = uv + vd_texsize.wz;
  389. }
  390.  
  391. float4 PS(float2 uv0 : TEXCOORD0, float2 uv1 : TEXCOORD1) : COLOR0 {
  392.     return tex2D(src, uv1) - (tex2D(src, uv0) - 0.5);
  393. }
  394.  
  395. technique point {
  396.     pass {
  397.         VertexShader = compile vs_1_1 VS();
  398.         PixelShader = compile ps_1_1 PS();
  399.     }
  400. }
  401. </pre></blockquote>
  402. </lina:create>
  403.